package ar.edu.utn.frsf.tpae.a2012.g05.entity;

import java.lang.reflect.Field;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "cli")
public class Cliente {

	@Id
	@Column(name = "cli_id")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	@Column(name = "cli_nro", length = 48, nullable = false, unique = true)
	private String numero;

	@Column(name = "cli_nom", length = 48, nullable = false)
	private String nombre;

	@Column(name = "cli_ape", length = 48, nullable = false)
	private String apellido;

	@Column(name = "cli_dni", length = 10, nullable = false)
	private String documento;

	@Column(name = "cli_cuil", length = 16, nullable = false)
	private String cuil;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "cli_fech_alta", nullable = false)
	private Date fechaAlta;

	@Column(name = "cli_dir_pos", length = 48, nullable = false)
	private String direccionPostal;

	@Column(name = "cli_tel", length = 20)
	private String telefono;

	@Column(name = "cli_mail", length = 45)
	private String email;
	
	@OneToMany(cascade = CascadeType.ALL, mappedBy="cliente", fetch=FetchType.EAGER)
    private List<Cuenta> cuentas;

	public Integer getId() {
		return id;
	}
	
	public Cliente() {
		super();
	}

	public Cliente(String numero, String nombre, String apellido,
			String documento, String cuil, Date fechaAlta,
			String direccionPostal, String telefono, String email) {
		super();
		this.numero = numero;
		this.nombre = nombre;
		this.apellido = apellido;
		this.documento = documento;
		this.cuil = cuil;
		this.fechaAlta = fechaAlta;
		this.direccionPostal = direccionPostal;
		this.telefono = telefono;
		this.email = email;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public String getDocumento() {
		return documento;
	}

	public void setDocumento(String documento) {
		this.documento = documento;
	}

	public String getCuil() {
		return cuil;
	}

	public void setCuil(String cuil) {
		this.cuil = cuil;
	}

	public Date getFechaAlta() {
		return fechaAlta;
	}

	public void setFechaAlta(Date fechaAlta) {
		this.fechaAlta = fechaAlta;
	}

	public String getDireccionPostal() {
		return direccionPostal;
	}

	public void setDireccionPostal(String direccionPostal) {
		this.direccionPostal = direccionPostal;
	}

	public String getTelefono() {
		return telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public List<Cuenta> getCuentas() {
		return cuentas;
	}

	public void setCuentas(List<Cuenta> cuentas) {
		this.cuentas = cuentas;
	}
	
	public List<Cuenta> addCuenta(Cuenta cuenta) {
		this.cuentas.add(cuenta);
		return cuentas;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((apellido == null) ? 0 : apellido.hashCode());
		result = prime * result + ((cuil == null) ? 0 : cuil.hashCode());
		result = prime * result
				+ ((direccionPostal == null) ? 0 : direccionPostal.hashCode());
		result = prime * result
				+ ((documento == null) ? 0 : documento.hashCode());
		result = prime * result + ((email == null) ? 0 : email.hashCode());
		result = prime * result
				+ ((fechaAlta == null) ? 0 : fechaAlta.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());
		result = prime * result + ((numero == null) ? 0 : numero.hashCode());
		result = prime * result
				+ ((telefono == null) ? 0 : telefono.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cliente other = (Cliente) obj;
		if (apellido == null) {
			if (other.apellido != null)
				return false;
		} else if (!apellido.equals(other.apellido))
			return false;
		if (cuil == null) {
			if (other.cuil != null)
				return false;
		} else if (!cuil.equals(other.cuil))
			return false;
		if (direccionPostal == null) {
			if (other.direccionPostal != null)
				return false;
		} else if (!direccionPostal.equals(other.direccionPostal))
			return false;
		if (documento == null) {
			if (other.documento != null)
				return false;
		} else if (!documento.equals(other.documento))
			return false;
		if (email == null) {
			if (other.email != null)
				return false;
		} else if (!email.equals(other.email))
			return false;
		if (fechaAlta == null) {
			if (other.fechaAlta != null)
				return false;
		} else if (!fechaAlta.equals(other.fechaAlta))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (nombre == null) {
			if (other.nombre != null)
				return false;
		} else if (!nombre.equals(other.nombre))
			return false;
		if (numero == null) {
			if (other.numero != null)
				return false;
		} else if (!numero.equals(other.numero))
			return false;
		if (telefono == null) {
			if (other.telefono != null)
				return false;
		} else if (!telefono.equals(other.telefono))
			return false;
		return true;
	}
	
	@Override
	public String toString() {
		return "Cliente [id=" + id + ", numero=" + numero + ", nombre="
				+ nombre + ", apellido=" + apellido + ", documento="
				+ documento + ", cuil=" + cuil + ", fechaAlta=" + fechaAlta
				+ ", direccionPostal=" + direccionPostal + ", telefono="
				+ telefono + ", email=" + email + "]";
	}

	public String toFullString() {
		StringBuilder result = new StringBuilder();
		String newLine = System.getProperty("line.separator");

		result.append(this.getClass().getName() + "{");
		result.append(newLine);

		Field[] fields = this.getClass().getDeclaredFields();

		for (Field field : fields) {
			result.append("  ");
			try {
				result.append(field.getName());
				result.append(": ");
				result.append(field.get(this));
			} catch (IllegalAccessException ex) {
				System.out.println(ex);
			}
			result.append(newLine);
		}
		result.append("}");

		return result.toString();
	}

}